//package com.aiti.lulian.server;
//
//
//import com.aiti.lulian.entity.LatestDealNews;
//import com.aiti.lulian.entity.MsgInbox;
//import com.aiti.lulian.service.LatestDealNewsService;
//import com.aiti.lulian.service.MsgInboxService;
//import com.alibaba.fastjson.JSON;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//
//import javax.websocket.*;
//import javax.websocket.server.PathParam;
//import javax.websocket.server.ServerEndpoint;
//import java.io.IOException;
//import java.util.Date;
//import java.util.List;
//import java.util.Map;
//import java.util.Set;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.atomic.AtomicInteger;
//
//@ServerEndpoint("/lastestDeal/{userId}")
//@Component
//@Slf4j
//public class LatestDealSocketServer {
//
//    private static AtomicInteger onlineNum = new AtomicInteger(0);
//    private static Map<String, Session> sessionPools = new ConcurrentHashMap<>();
//
//
//    private static LatestDealNewsService latestDealNewsService;
//
//    @Autowired
//    public void setLatestDealNewsService(LatestDealNewsService latestDealNewsService) {
//        LatestDealSocketServer.latestDealNewsService = latestDealNewsService;
//    }
//
//
//
//
//    public void sendMessage(Session session, String message) throws IOException {
//        if (session != null) {
//            synchronized (session) {
//                log.info("发送最新成交数据：" + message);
//                session.getBasicRemote().sendText(message);
//            }
//        }
//    }
//
//    public void sendInfo(String userId, String message) {
//        Session session = sessionPools.get(userId);
//        try {
//            sendMessage(session, message);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    public void broadcast(String message) {
//        sessionPools.values().forEach(session -> {
//            try {
//                sendMessage(session, message);
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        });
//    }
//
//    @OnOpen
//    public void onOpen(Session session, @PathParam(value = "userId") String userId) {
//        sessionPools.put(userId, session);
//        onlineNum.incrementAndGet();
//        log.info(userId + " 加入 lastestDealSocket！当前人数为 " + onlineNum);
//
//        // 加载历史消息
//        loadHistoryMessages(userId);
//
//    }
//
//    @OnClose
//    public void onClose(@PathParam(value = "userId") String userId) {
//        sessionPools.remove(userId);
//        onlineNum.decrementAndGet();
//        log.info(userId + " 断开 WebSocket 连接！当前人数为 " + onlineNum);
//
//    }
//
//    @OnMessage
//    public void onMessage(String message) throws IOException {
//        log.info("lastestDealServer get " + message);
//        LatestDealNews msg = JSON.parseObject(message, LatestDealNews.class);
//        msg.setBaseCreateTime(new Date());
//        //保存消息到数据库
//        latestDealNewsService.save(msg);
//
//        broadcast(JSON.toJSONString(msg, true));
//    }
//
//    @OnError
//    public void onError(Session session, Throwable throwable) throws IOException {
//        log.info("lastestDeal发生错误");
//        throwable.printStackTrace();
//    }
//
//    private void loadHistoryMessages(String userId) {
//        LambdaQueryWrapper<LatestDealNews> wrapper = new LambdaQueryWrapper<>();
//        wrapper.orderByDesc(LatestDealNews::getBaseCreateTime);
//        List<LatestDealNews> messages = latestDealNewsService.list(wrapper);
//        messages.forEach(msg -> {
//            try {
//                sendMessage(sessionPools.get(userId), JSON.toJSONString(msg, true));
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        });
//    }
//
//    private void loadBroadCastHistoryMessages() {
//        LambdaQueryWrapper<LatestDealNews> wrapper = new LambdaQueryWrapper<>();
//        wrapper.orderByDesc(LatestDealNews::getBaseCreateTime);
//        List<LatestDealNews> messages = latestDealNewsService.list(wrapper);
//        Set<Map.Entry<String, Session>> entries = sessionPools.entrySet();
//        for(Map.Entry<String, Session> entry : entries){
//            String userId = entry.getKey();
//            messages.forEach(msg -> {
//                try {
//                    sendMessage(sessionPools.get(userId), JSON.toJSONString(msg, true));
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            });
//        }
//
//    }
//
//
//    public void sendBroadcastMessage(String message) throws IOException {
//        log.info("lastestDealServer sendBroadcastMessage get " + message);
//        broadcast(JSON.toJSONString(message, true));
//    }
//
////    public void deleteAndSendMessage(String message) throws IOException {
////        log.info("lastestDealServer deleteAndSendMessage");
////        loadBroadCastHistoryMessages();
////    }
////
////    public void updateAndSendMessage(String message) throws IOException {
////        log.info("lastestDealServer updateAndSendMessage");
////        loadBroadCastHistoryMessages();
////    }
//
//    public static AtomicInteger getOnlineNumber() {
//        return onlineNum;
//    }
//
//    public static Map<String, Session> getSessionPools() {
//        return sessionPools;
//    }
//}
